再來就是做迴圈內的事了,兩邊都做了Jump的動作。
GDB比較快知道,跳到main+58的位址,因此我們直接看到+58的位址,簡單來說就是進行比較,是剛剛放入的0的位址RBP-0x4與0x5進行比較。
IDA的部分往下看一點也能發現Jump到的loc_1004010BB這個Function,可以發現裡面做的事情一模一樣,同樣是比較RBP-0x4中的值是否為5。
再下一行就是做JLE,JLE意思是Jump if Less or Equal,如果CMP的值小於等於就轉跳,這個時候就是EFLAGS出場的時候了,雖然表面上是做比較而已,但實際上是做相減,因此會用到ZF、CF和SF(查看是否為零、是否進位以及是否為負數),這邊第一個做的是0-5,因此做完第一次的期望是0需要進位和會變負數,因此CF和SF會為1。
先看做CMP之前的EFLAGS狀態,IF是Interrupt enable flag,但這邊與我們需要注意的無關,有興趣的可以探索其他的EFLAGS,接下來的EFLAGS我們只會注意CMP可能會有變化的EFLAGS。
做了第一次的比較後
可以看到CF、AF和SF都改變了值,與我們一開始想的一樣,進位與負數皆為1,這裡還多了AF,因為此運算是低四位的,但這邊我們先不管它。
那0-5這個結果與JLE的期望相同,因此這邊就會跳到GDB main+42,IDA loc_1004010AB這邊。